From 885e7ea12b7363d6b71309e4da7cd89c2c0e96cf Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Fri, 15 Jul 2016 20:14:34 +0300 Subject: [PATCH] Retrieve Rustc info lazily --- src/cargo/ops/cargo_clean.rs | 3 ++- src/cargo/ops/cargo_compile.rs | 2 +- src/cargo/ops/cargo_rustc/fingerprint.rs | 2 +- src/cargo/ops/cargo_rustc/mod.rs | 2 +- src/cargo/ops/cargo_test.rs | 2 +- src/cargo/util/config.rs | 17 ++++++++--------- tests/version.rs | 7 +++++++ 7 files changed, 21 insertions(+), 14 deletions(-) diff --git a/src/cargo/ops/cargo_clean.rs b/src/cargo/ops/cargo_clean.rs index b20559337..2938e70cc 100644 --- a/src/cargo/ops/cargo_clean.rs +++ b/src/cargo/ops/cargo_clean.rs @@ -33,9 +33,10 @@ pub fn clean(ws: &Workspace, opts: &CleanOptions) -> CargoResult<()> { let packages = ops::get_resolved_packages(&resolve, registry); let profiles = try!(ws.current()).manifest().profiles(); + let host_triple = try!(opts.config.rustc_info()).host.clone(); let mut cx = try!(Context::new(ws, &resolve, &packages, opts.config, BuildConfig { - host_triple: opts.config.rustc_info().host.clone(), + host_triple: host_triple, requested_target: opts.target.map(|s| s.to_owned()), release: opts.release, ..BuildConfig::default() diff --git a/src/cargo/ops/cargo_compile.rs b/src/cargo/ops/cargo_compile.rs index 744cc54e9..17539c4d7 100644 --- a/src/cargo/ops/cargo_compile.rs +++ b/src/cargo/ops/cargo_compile.rs @@ -443,7 +443,7 @@ fn scrape_build_config(config: &Config, let cfg_target = try!(config.get_string("build.target")).map(|s| s.val); let target = target.or(cfg_target); let mut base = ops::BuildConfig { - host_triple: config.rustc_info().host.clone(), + host_triple: try!(config.rustc_info()).host.clone(), requested_target: target.clone(), jobs: jobs, ..Default::default() diff --git a/src/cargo/ops/cargo_rustc/fingerprint.rs b/src/cargo/ops/cargo_rustc/fingerprint.rs index 2bef5a907..d8b62319b 100644 --- a/src/cargo/ops/cargo_rustc/fingerprint.rs +++ b/src/cargo/ops/cargo_rustc/fingerprint.rs @@ -352,7 +352,7 @@ fn calculate<'a, 'cfg>(cx: &mut Context<'a, 'cfg>, unit: &Unit<'a>) try!(cx.rustflags_args(unit)) }; let fingerprint = Arc::new(Fingerprint { - rustc: util::hash_u64(&cx.config.rustc_info().verbose_version), + rustc: util::hash_u64(&try!(cx.config.rustc_info()).verbose_version), target: util::hash_u64(&unit.target), profile: util::hash_u64(&unit.profile), features: format!("{:?}", features), diff --git a/src/cargo/ops/cargo_rustc/mod.rs b/src/cargo/ops/cargo_rustc/mod.rs index 204d4d0ad..76f9dc27f 100644 --- a/src/cargo/ops/cargo_rustc/mod.rs +++ b/src/cargo/ops/cargo_rustc/mod.rs @@ -204,7 +204,7 @@ fn rustc(cx: &mut Context, unit: &Unit) -> CargoResult { let name = unit.pkg.name().to_string(); if !cx.show_warnings(unit.pkg.package_id()) { - if cx.config.rustc_info().cap_lints { + if try!(cx.config.rustc_info()).cap_lints { rustc.arg("--cap-lints").arg("allow"); } else { rustc.arg("-Awarnings"); diff --git a/src/cargo/ops/cargo_test.rs b/src/cargo/ops/cargo_test.rs index 3e22a7e17..5eb106b1e 100644 --- a/src/cargo/ops/cargo_test.rs +++ b/src/cargo/ops/cargo_test.rs @@ -117,7 +117,7 @@ fn run_doc_tests(options: &TestOptions, // We don't build/rust doctests if target != host if let Some(target) = options.compile_opts.target { - if config.rustc_info().host != target { + if try!(config.rustc_info()).host != target { return Ok(errors); } } diff --git a/src/cargo/util/config.rs b/src/cargo/util/config.rs index a89f010e8..37bdf0357 100644 --- a/src/cargo/util/config.rs +++ b/src/cargo/util/config.rs @@ -24,7 +24,7 @@ use self::ConfigValue as CV; pub struct Config { home_path: Filesystem, shell: RefCell, - rustc_info: Rustc, + rustc_info: RefCell>, values: RefCell>, values_loaded: Cell, cwd: PathBuf, @@ -41,7 +41,7 @@ impl Config { let mut cfg = Config { home_path: Filesystem::new(homedir), shell: RefCell::new(shell), - rustc_info: Rustc::blank(), + rustc_info: RefCell::new(None), cwd: cwd, values: RefCell::new(HashMap::new()), values_loaded: Cell::new(false), @@ -52,7 +52,6 @@ impl Config { }; try!(cfg.scrape_tool_config()); - try!(cfg.scrape_rustc_version()); try!(cfg.scrape_target_dir_config()); Ok(cfg) @@ -100,7 +99,12 @@ impl Config { pub fn rustdoc(&self) -> &Path { &self.rustdoc } - pub fn rustc_info(&self) -> &Rustc { &self.rustc_info } + pub fn rustc_info(&self) -> CargoResult> { + if self.rustc_info.borrow().is_none() { + *self.rustc_info.borrow_mut() = Some(try!(Rustc::new(&self.rustc))); + } + Ok(Ref::map(self.rustc_info.borrow(), |opt| opt.as_ref().unwrap())) + } pub fn values(&self) -> CargoResult>> { if !self.values_loaded.get() { @@ -368,11 +372,6 @@ impl Config { Ok(()) } - fn scrape_rustc_version(&mut self) -> CargoResult<()> { - self.rustc_info = try!(Rustc::new(&self.rustc)); - Ok(()) - } - fn scrape_target_dir_config(&mut self) -> CargoResult<()> { if let Some(dir) = env::var_os("CARGO_TARGET_DIR") { *self.target_dir.borrow_mut() = Some(Filesystem::new(self.cwd.join(dir))); diff --git a/tests/version.rs b/tests/version.rs index e8b38262a..f15f1e2cd 100644 --- a/tests/version.rs +++ b/tests/version.rs @@ -49,3 +49,10 @@ Options: usage, &args, false); assert_eq!(result.unwrap(), Some("foo ".to_string())); } + +#[test] +fn version_works_without_rustc() { + let p = project("foo"); + assert_that(p.cargo_process("version").env("PATH", ""), + execs().with_status(0)); +} \ No newline at end of file -- 2.30.2